gnomeos: Make run script transparently update existing FS image
authorColin Walters <walters@verbum.org>
Sun, 4 Dec 2011 19:56:21 +0000 (14:56 -0500)
committerColin Walters <walters@verbum.org>
Sun, 4 Dec 2011 19:56:21 +0000 (14:56 -0500)
This is noticeably faster.

gnomeos/yocto/gnomeos-run.sh

index 12f8e3a200993f4dda72904d4771b96c90861cd5..b4d342909e7321627a9cb618ee8a211528f8ef1f 100755 (executable)
@@ -49,41 +49,49 @@ if (! test -f ${OBJ}); then
     rm -f ${OBJ}.tmp
     qemu-img create ${OBJ}.tmp 2G
     mkfs.ext3 -q -F ${OBJ}.tmp
-    mkdir -p fs
-    umount fs || true
-    mount -o loop ${OBJ}.tmp fs
+    mv ${OBJ}.tmp ${OBJ}
+fi
+
+mkdir -p fs
+umount fs || true
+sleep 1 # Avoid Linux kernel bug, pretty sure it's the new RCU pathname lookup
+mount -o loop gnomeos-fs.img fs
+
+cd fs
 
-    cd fs
+TOPROOT_BIND_MOUNTS="home root tmp"
 
-    TOPROOT_BIND_MOUNTS="home root tmp"
-    
-    for d in $TOPROOT_BIND_MOUNTS; do
+for d in $TOPROOT_BIND_MOUNTS; do
+    if ! test -d $d; then
         mkdir -m 0755 $d
-    done
-    chmod a=rwxt tmp
+    fi
+done
+chmod a=rwxt tmp
 
+if ! test -d ostree; then
     mkdir ostree
     mkdir -p -m 0755 ./ostree/var/{log,run,tmp,spool}
-    cd ostree
-    mkdir repo
-    ostree --repo=repo init
-    ostree --repo=${OSTREE_REPO} local-clone repo
-    for branch in base dev; do
-        rev=$(ostree --repo=repo rev-parse ${BRANCH_PREFIX}${branch});
+    mkdir ostree/repo
+    ostree --repo=ostree/repo init
+fi
+cd ostree
+ostree --repo=${OSTREE_REPO} local-clone repo
+for branch in base dev; do
+    rev=$(ostree --repo=repo rev-parse ${BRANCH_PREFIX}${branch});
+    if ! test -d ${BRANCH_PREFIX}${branch}-${rev}; then
         ostree --repo=repo checkout ${rev} ${BRANCH_PREFIX}${branch}-${rev}
-        ln -s ${BRANCH_PREFIX}${branch}-${rev} ${BRANCH_PREFIX}${branch}-current
-    done
-    cd ..
+    fi
+    ln -sf ${BRANCH_PREFIX}${branch}-${rev} ${BRANCH_PREFIX}${branch}-current
+done
+cd ..
 
-    mkdir proc # needed for ostree-init
-    cp -a ./ostree/${BRANCH_PREFIX}base-current/usr/sbin/ostree-init .
+test -d proc || mkdir proc # needed for ostree-init
+cp -a ./ostree/${BRANCH_PREFIX}base-current/usr/sbin/ostree-init .
 
-    cd ${WORKDIR}
-    
-    umount fs
-    rmdir fs
-    mv ${OBJ}.tmp ${OBJ}
-fi
+cd ${WORKDIR}
+
+umount fs
+rmdir fs
 
 ARGS="$@"
 if ! echo $ARGS | grep -q 'init='; then